Webサイトの表示速度はSEO・ユーザー体験・コンバージョン率に直結します。Googleの調査では、ページ読み込みが3秒を超えると53%のユーザーが離脱するとされています。本記事では、Core Web Vitalsを中心に、すぐに実践できるパフォーマンス最適化テクニックを解説します。
💡 この記事のポイント
パフォーマンス改善は「計測 → 改善 → 計測」のサイクルが重要です。まずChrome DevToolsのLighthouseでスコアを確認してから取り組みましょう。
1. Core Web Vitalsとは
GoogleがWebページの品質を評価する3つの指標です。検索ランキングにも影響します。
- LCP(Largest Contentful Paint):最大コンテンツの表示時間 → 2.5秒以内が良好
- INP(Interaction to Next Paint):インタラクション応答速度 → 200ms以内が良好
- CLS(Cumulative Layout Shift):レイアウトのズレの累積 → 0.1以下が良好
2. LCPの改善
LCPはユーザーが「ページが表示された」と感じるまでの時間です。
改善テクニック
<!-- 1. 重要なリソースのプリロード -->
<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/hero-image.webp" as="image">
<!-- 2. 外部リソースへの事前接続 -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="dns-prefetch" href="https://analytics.example.com">
<!-- 3. クリティカルCSSのインライン化 -->
<style>
/* ファーストビューに必要な最小限のCSS */
body { margin: 0; font-family: system-ui; }
.hero { min-height: 100vh; display: flex; align-items: center; }
</style>
<!-- 4. 非クリティカルCSSの遅延読み込み -->
<link rel="stylesheet" href="/style.css" media="print" onload="this.media='all'">
広告
3. CLSの改善
CLSはページのレイアウトが突然ズレる問題です。広告の遅延読み込みや画像のサイズ未指定が主な原因です。
<!-- ❌ CLSを引き起こすコード -->
<img src="photo.jpg"> <!-- width/heightの指定なし -->
<!-- ✅ CLSを防ぐコード -->
<img src="photo.jpg" width="800" height="600" alt="説明"
style="aspect-ratio: 4/3; width: 100%; height: auto;">
<!-- ✅ 広告枠のスペース予約 -->
<div style="min-height: 250px;">
<!-- 広告コンテンツ -->
</div>
<!-- ✅ Webフォントのfont-display設定 -->
<style>
@font-face {
font-family: 'CustomFont';
src: url('/fonts/custom.woff2') format('woff2');
font-display: swap; /* テキストの非表示時間を最小化 */
}
</style>
4. 画像最適化
画像は一般的にWebページのデータ量の50%以上を占めます。
<!-- 次世代フォーマット(WebP/AVIF)の活用 -->
<picture>
<source srcset="image.avif" type="image/avif">
<source srcset="image.webp" type="image/webp">
<img src="image.jpg" alt="説明" width="800" height="600" loading="lazy">
</picture>
<!-- レスポンシブ画像 -->
<img
srcset="image-400.webp 400w, image-800.webp 800w, image-1200.webp 1200w"
sizes="(max-width: 600px) 400px, (max-width: 900px) 800px, 1200px"
src="image-800.webp"
alt="説明"
loading="lazy"
decoding="async"
>
✅ 画像フォーマットの選び方
AVIFが最も圧縮率が高い(JPEGの50%以下)。対応ブラウザが広いWebPをベースに、AVIFをプログレッシブエンハンスメントで提供するのが最適です。
5. 遅延読み込み戦略
// 画像のネイティブ遅延読み込み(HTML属性)
// loading="lazy" をimgタグに追加するだけ
// JavaScriptの遅延読み込み(動的インポート)
const loadChart = async () => {
const { Chart } = await import('chart.js');
// チャートの初期化
};
// Intersection Observerによる要素の遅延読み込み
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
}, { rootMargin: '200px' }); // 200px手前から読み込み開始
// スクリプトの非同期読み込み
// async: ダウンロード後すぐ実行(順序保証なし)
// defer: HTML解析完了後に順序通り実行
// <script src="analytics.js" defer></script>
6. キャッシュ戦略
# .htaccess または nginx.conf でのキャッシュ設定例
# 静的ファイルのブラウザキャッシュ
# CSS/JS: ハッシュ付きファイル名なら長期キャッシュ
Cache-Control: public, max-age=31536000, immutable
# HTML: 短いキャッシュ + 再検証
Cache-Control: public, max-age=3600, must-revalidate
# API: キャッシュなし
Cache-Control: no-cache, no-store, must-revalidate
パフォーマンス計測ツール
- Lighthouse(Chrome DevTools内蔵):総合スコアと改善提案
- PageSpeed Insights:実ユーザーデータ(CrUX)+ Lighthouse
- WebPageTest:詳細なウォーターフォール分析
- Chrome DevTools Performance:ランタイムパフォーマンス分析
パフォーマンス最適化は小さな改善の積み重ねです。まずはLighthouseでスコアを確認し、最も影響の大きい項目から着手しましょう。1秒の高速化がコンバージョン率7%向上につながるケースもあります。